package com.app.designpattern.creation.singleton;

/**
 * USER: zjw
 * DATA: 2019/4/11 0011
 * TIME: 下午 2:28
 * 双重检验
 * 双重检验和直接在方法上加synchronized有什么区别呢?
 * 1.方法上加synchronized :单例类在初始的时候都会调用这个方法,但是应为synchronized中有加锁和解锁,每次调用就会进行着俩个处理,影响性能
 * 2.双重:首先进来"第一次非空判断",如果不为空直接返回,减少了synchronized的使用,优化了性能;加同步锁,避免多个线程创建多个对像;"第二个非空
 * 判断":当多个线程是,其中一个线程解锁后,另一个线程初始化之前首先判断上个线程是否已经初始化,避免创建多个线程
 */
public class LazyDoubleCheckSingleton {
    private volatile static LazyDoubleCheckSingleton lazyDoubleCheckSingleton = null;

    private LazyDoubleCheckSingleton() {
    }

    public static LazyDoubleCheckSingleton getInstance() {
        if (lazyDoubleCheckSingleton == null) {
            synchronized (LazyDoubleCheckSingleton.class) {
                if (lazyDoubleCheckSingleton == null) {
                    lazyDoubleCheckSingleton = new LazyDoubleCheckSingleton();
                    //1.首先分配内存
                    //2.初始化对像
                    //3.地址指向内存地址
                    //4.使用对像
                    //重排序的问题,有可能2,3部有概率会执行顺序不一样,
                }
            }
        }
        return lazyDoubleCheckSingleton;
    }
}
